import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

/**
 * Created with IDEA
 * Author: LuoHengYi
 * Date: 2022/6/17
 * Time: 10:37
 */
public class Sender {

    public static void main(String[] args) {


        //创建链接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setPort(5672);
        //作用域，不同的业务可以分配不同的作用域 /order ，/message
        connectionFactory.setVirtualHost("/");


        try {
            //获取链接
            Connection connection = connectionFactory.newConnection();
            //每个Channel代表一个会话任务,类似sqlsession
            Channel channel = connection.createChannel();

            //队列名称
            String queueName="test001";

            //创建一个队列-- 参数 --> 队列名称，是否持久化，独占的queue（该队列只能有一个链接），不使用时自动删除，其他参数
            channel.queueDeclare(queueName,false,false,false,null);

            Map<String, Object> header = new HashMap<>();

            AMQP.BasicProperties properties = new AMQP.BasicProperties().builder()
                    //2代表持久化
                    .deliveryMode(2)
                    .contentEncoding("UTF-8")
                    //自定义header
                    .headers(header).build();

            String routingKey = queueName;
            for (int i = 0; i < 5; i++) {
                String msg = "你好我是罗恒i"+i;
                //指定exchange交换机，如果为空则使用默认交换机，直连到与routingKey同名的queueName队列
                /* 发送消息
                 *@param  exchange 将消息发送到的交换机名称
                 *@param  routingKey 路由规则， 交换机 根据 routingKey 找到发送到query（routingKey与query是一一绑定的）
                 *@param  props 消息的其他属性 - 路由标头等
                 *@param  body 消息体
                 */
                channel.basicPublish("",routingKey,properties,msg.getBytes());
            }


        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }


    }
}
